package com.chenyun.common.vo;

import com.alibaba.fastjson2.JSON;
import lombok.Data;
import lombok.extern.slf4j.Slf4j;
import org.springframework.boot.context.properties.ConfigurationProperties;
import org.springframework.web.filter.OncePerRequestFilter;

import java.io.Serializable;
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;

/**
 * 应用的配置类
 *
 * @author: Lonni
 * @date: 2023/12/6 0006 15:56
 */
@ConfigurationProperties(prefix = "chenyun")
@Data
@Slf4j
public class ApplicationProperties implements Serializable {
    static List<String> tenantIgTables = new ArrayList<String>() {{
        add("sys_dict_type");
        add("sys_dict_data");
        add("sys_sys_region");
        add("gen_datasource_store");
        add("gen_table");
        add("gen_table_column");
        add("sys_role_dept");
        add("sys_role_menu");
        add("sys_user_post");
        add("sys_user_role");
        add("sys_tenant");
        add("sys_tenant_type");
        add("xxl_job_group");
        add("xxl_job_info");
        add("xxl_job_lock");
        add("xxl_job_log");
        add("xxl_job_log_report");
        add("xxl_job_logglue");
        add("xxl_job_registry");
        add("xxl_job_user");

    }};
    public ApplicationProperties() {
        log.info("系统配置文件-ApplicationProperties加载");
    }

    /**
     * 是否是演示环境
     */
    private Boolean demo;
    /**
     * 是否是测试环境
     */
    private Boolean isTest;

    /**
     * swagger配置
     */
    private SwaggerProperties swagger;
    /**
     * websocket配置
     */

    private WebsocketProperties websocket;
    /**
     * satoken其他配置
     */

    private SatokenProperties satoken;

    /**
     * 是否开启多租户
     */
    private Boolean tenantEnable = true;
    /**
     * yitterid的工作id
     */
    private String workId;
    /**
     * 是否多商户模式
     */
    private Boolean multiStore;


    /**
     * 多租户忽略表
     */
    private List<String> tenantIgnoreTables=tenantIgTables;
    /**
     * 需要忽略多租户的请求
     * 使用 {@link OncePerRequestFilter }实现Filter ;
     * 暂不使用
     */
    @Deprecated
    private Set<String> ignoreTenUrls = Collections.emptySet();

    public static class SwaggerProperties {

        private String title;
        private String desc;
        private String version;

        public String getTitle() {
            return title;
        }

        public void setTitle(String title) {
            this.title = title;
        }

        public String getDesc() {
            return desc;
        }

        public void setDesc(String desc) {
            this.desc = desc;
        }

        public String getVersion() {
            return version;
        }

        public void setVersion(String version) {
            this.version = version;
        }
    }

    public static class WebsocketProperties {
        /**
         * 路径 如 /ws
         */
        private String path;
        private Boolean enable;
        private Integer port;
        /**
         * # 类型 netty | stomp
         */
        private String type;

        public String getPath() {
            return path;
        }

        public void setPath(String path) {
            this.path = path;
        }

        public Boolean getEnable() {
            return enable;
        }

        public void setEnable(Boolean enable) {
            this.enable = enable;
        }

        public Integer getPort() {
            return port;
        }

        public void setPort(Integer port) {
            this.port = port;
        }

        public String getType() {
            return type;
        }

        public void setType(String type) {
            this.type = type;
        }
    }

    public static class SatokenProperties {
        private static List<String> igpath = new ArrayList<>();
        private static volatile Boolean isLoadPermissionUrl = false;

        static {
            igpath.add("/**/error");
            igpath.add("/feign/**");
            igpath.add("/doc.html");
            igpath.add("/webjars/**");
            igpath.add("/api-docs-ext");
            igpath.add("/api-docs");
            igpath.add("/swagger-ui.html");
            igpath.add("/swagger-resources/**");
            igpath.add("/actuator/**");
            igpath.add("/v2/**");
            igpath.add("/css/**");
            igpath.add("/js/**");
            igpath.add("/**/*.html");
            igpath.add("/**/*.css");
            igpath.add("/**/*.js");
            igpath.add("/**/*.json");
            igpath.add("*.js");
            igpath.add("*.gif");
            igpath.add("*.jpg");
            igpath.add("*.png");
            igpath.add("*.css");
            igpath.add("*.ico");
            igpath.add("/druid/**");
            igpath.add("/images/**");
            igpath.add("/favicon.ico");
            igpath.add("/service-worker.js");
            igpath.add("/actuator/**");

        }


        /**
         * 是否检验服务内部调用的token,一般是网关和feign使用
         */
        private Boolean checkInner;
        private List<String> whiteUrls;

        public Boolean getCheckInner() {
            return checkInner;
        }

        public void setCheckInner(Boolean checkInner) {
            this.checkInner = checkInner;
        }

        public List<String> getWhiteUrls() {
            return whiteUrls;
        }

        public void setWhiteUrls(List<String> whiteUrls) {
            this.whiteUrls = whiteUrls;
        }


        /**
         * 获取所有白名单
         *
         * @return
         */
        public List<String> getAllIgnorePath() {
            if (isLoadPermissionUrl) {
                log.info("应用白名单为:{}", JSON.toJSONString(igpath));
                return igpath;
            }
            synchronized (igpath) {

                if (this.whiteUrls != null && !this.whiteUrls.isEmpty()) {
                    igpath.addAll(this.whiteUrls);
                }
                isLoadPermissionUrl = true;
                log.info("应用白名单为:{}", JSON.toJSONString(igpath));
                return igpath;
            }
        }
    }

}



